import java.util.HashMap;
import java.util.Map;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: 冯若航
 * \* Date: 2021/6/9
 * \* Time: 10:00
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class 最小覆盖子串 {
    public String minWindow(String s, String t) {
        Map<Character, Integer> need=new HashMap<>();
        Map<Character, Integer> window=new HashMap<>();
        for(char ch : t.toCharArray()){
            need.put(ch,need.getOrDefault(ch,0) + 1);
        }
        int left=0,right=0;
        int valid=0;
        //记录最小覆盖子串的起始索引及长度
        int start=0,len=Integer.MAX_VALUE;

        while (right<s.length()){
            // c 是将移入窗口的字符
            char c=s.charAt(right);
            right++;
            // 进行窗口内数据的一系列更新
            if(need.containsKey(c)){
                window.put(c, window.getOrDefault(c,0)+1);
            }
            if(window.get(c).equals(need.get(c))){
                valid++;
            }
            // 判断左侧窗口是否要收缩
            while (valid==need.size()){
                // 在这里更新最小覆盖子串
                if(right-left<len){
                    start=left;
                    len=right-left;
                }
                // d 是将移出窗口的字符
                char d = s.charAt(left);
                // 左移窗口
                left++;
                // 进行窗口内数据的一系列更新
                if(need.containsKey(d)){
                    if(window.get(d).equals(need.get(d))){
                        valid--;
                    }
                    window.put(d,window.getOrDefault(d,0)-1);
                }
            }
        }

        return len==Integer.MAX_VALUE?"":s.substring(start,start+len);
    }
}